package com.woniuxy.dynamic.jdk;

import com.woniuxy.dynamic.aspect.LogForService;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author: wgt
 * Date: 2021/11/15:15:12
 * Description:
 */
public class JdkDynamic {
    //创建代理对象，这里就是动态生成代理后的对象的方法，

    /**
     * 获取代理好的代理对象
     * @param targetClass 被代理的目标对象
     * @return
     */
    public Object getProxyObject(Object targetClass){
        /*
        newProxyInstance的第一个参数，类加载器，是哪个对象的类加载器？我要代理的那个对象的加载器
        使用匿名内部类的写法
         */
        Object o = Proxy.newProxyInstance(targetClass.getClass().getClassLoader(), targetClass.getClass().getInterfaces(),
                (Object proxy, Method method, Object[] args)->{
                    //直接写业务 这个就是方法体
                    //1.方法前增强
                    LogForService logForService = new LogForService();
                    logForService.beforeStrengthen();
                    //2.目标类的方法 它就相当于反射一个对象然后执行对象的方法
                    Object invoke = method.invoke(targetClass, args);
                    //3.方法后增强
                    logForService.afterStrengthen();
                    return invoke;
                });
        return o;
    }
}
